/*
 * Copyright 2002-2020 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.config;

import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.AttributeAccessor;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
/**
 * beanDefinition作为定义spring bean 文件中的bean的接口，可以说是bean的抽象的数据结构，它包括属性参数，构造器参数，以及其他具体的参数。
 * beanDefinition 继承了AttributeAccessor和BeanMetadataElement ，拥有了对于元数据访问的功能。
 */
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
	/*单例的作用域*/
	String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
	/*多例作用域*/
	String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

	/*用户*/
	int ROLE_APPLICATION = 0;
	/*某些复杂的配置*/
	int ROLE_SUPPORT = 1;
	/*完全内部使用*/
	int ROLE_INFRASTRUCTURE = 2;


	/*设置父类的名字*/
	void setParentName(@Nullable String parentName);
	/*获取父类的名字*/
	@Nullable
	String getParentName();
	/*设置class类型名*/
	void setBeanClassName(@Nullable String beanClassName);
	/*返回当前bean的名字（并不是准确的名字，有些childBeanDefinition是继承自父bean的名字）*/
	/*所以不能依靠该名字确定class的类型*/
	@Nullable
	String getBeanClassName();
	/*设置作用域*/
	void setScope(@Nullable String scope);
	/*获取作用域*/
	@Nullable
	String getScope();
	/*设置懒加载*/
	void setLazyInit(boolean lazyInit);
	/*判断是否懒加载*/
	boolean isLazyInit();
	/*设置依赖的bean*/
	void setDependsOn(@Nullable String... dependsOn);
	/*依赖的bean*/
	@Nullable
	String[] getDependsOn();
	/*设置优先注入其他bean*/
	void setAutowireCandidate(boolean autowireCandidate);
	/*是否优先注入其他bean*/
	boolean isAutowireCandidate();
	/*设置优先自动装配*/
	void setPrimary(boolean primary);
	/*这个bean是否优先自动装配*/
	boolean isPrimary();
	/*设置工厂bean的名字*/
	void setFactoryBeanName(@Nullable String factoryBeanName);
	/*返回工厂bean的名字*/
	@Nullable
	String getFactoryBeanName();
	/*设置工厂方法名*/
	void setFactoryMethodName(@Nullable String factoryMethodName);
	/*返回工厂方法名*/
	@Nullable
	String getFactoryMethodName();
	/*获取构造函数的值*/
	ConstructorArgumentValues getConstructorArgumentValues();
	/*判断是否有构造器参数*/
	default boolean hasConstructorArgumentValues() {
		return !getConstructorArgumentValues().isEmpty();
	}
	/*获取参数的值*/
	MutablePropertyValues getPropertyValues();
	/*判断是否有属性参数*/
	default boolean hasPropertyValues() {
		return !getPropertyValues().isEmpty();
	}
	/*设置初始化方法*/
	void setInitMethodName(@Nullable String initMethodName);
	/*获取初始化方法的名字*/
	@Nullable
	String getInitMethodName();
	/*设置销毁方法的名字*/
	void setDestroyMethodName(@Nullable String destroyMethodName);
	/*获取销毁方法的名字*/
	@Nullable
	String getDestroyMethodName();
	/*设置角色*/
	void setRole(int role);
	/*获取角色*/
	int getRole();
	/*设置描述信息*/
	void setDescription(@Nullable String description);
	/*获取描述信息*/
	@Nullable
	String getDescription();


	// Read-only attributes

	ResolvableType getResolvableType();
	/*是否是单例的*/
	boolean isSingleton();
	/*是否是多例的*/
	boolean isPrototype();
	/*是否是抽象bean*/
	boolean isAbstract();
	/*获取资源描述*/
	@Nullable
	String getResourceDescription();
	/*有些beanDeFInition会使用beanDefinitionResource进行包装，将beanDefinition描述为一个资源*/
	@Nullable
	BeanDefinition getOriginatingBeanDefinition();

}
